/*
 * Copyright (c) 2025 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

export class CustomError extends Error {
  name: string;
  code: ErrorCodes;

  constructor(message: string, code: ErrorCodes) {
    super(message);
    this.name = 'CustomError';
    this.code = code;
  }
}

export enum ErrorCodes {
  INTERNAL_ERROR = 3000, // 内部未知错误
  TEMPLATE_NOT_FOUND = 3011, // 没有找到模板
  TEMPLATE_REGISTER_FAIL = 3012, // 性能和严格模式模板注册失败
  ROOT_DIRECTROY_NOT_FOUND = 3021, // 源码根目录查找失败
  INVALID_OUTPUT_FAIL = 3022, // 模板文件输出路径无效
  INVALID_FILE_CONTENT = 3023, // 查找文件内容无效，例如为空的时候
  HANDLER_NOT_FOUND = 3031, // 数据类型对应handler处理器查找失败
  CLASS_DECLARATION_NOT_FOUND = 3032, // 未查找到类对应ClassDeclaration（ts-morph库的概念，用于获取类的基本信息）
  IS_NOT_ENUM = 3033, // 枚举解析器解析到非枚举类型
  ENUM_STRUCTURE_NOT_FOUND = 3034, // 未查找到枚举类型对应structure解析结构
  TYPE_NOT_SUPPORT = 3041, // 自定义类中属性字段类型不支持
  LITERAL_NOT_SOPPORT = 3042, // 字面量类型不支持
  TRANSIENT_ATTR_OPTIONAL = 3043, // @Transient装饰属性必须是可选，或者存在默认值
  ANNOTATION_CONFLICT = 3044, // 同一个属性存在多个Serialization属性装饰器
  UNEXPECTED_GENERIC = 3051, // 不支持的泛型定义
  GENERIC_NOT_MATCH = 3052, // 定义的泛型个数不匹配
  UNION_STRUCTURE_NOT_FOUND = 3061, // 未查找到联合类型对应structure解析结构
  UNION_EXPEDTED_TWO = 3062, // 当联合类型一部分undefined或者nul时，泛型长度为2，另一部分可以支持带泛型参数的自定义class
  UNION_INNER_NOT_FOUND = 3063, // 当联合类型一部分undefined或者nul时，泛型长度为2时，未查找到另一部分非null或者undefined定义
  UNION_UNSUPPORTED_PATTERN = 3064, // 不支持的联合类型 
  UNION_EXPEDTED_THREE = 3065, // 当联合类型一部分undefined或者nul时，泛型长度为3，另一部分可以支持带泛型参数的自定义class
  REWRITE_IMPORT_FAIL = 3071, // 重写源文件import失败
  NOT_SENDABLE = 3072, // sendable类定义的属性费非sendable类型
}